package com.jiepu.daily.corejava.advanceed.part2.day0717;

import com.jiepu.daily.corejava.advanceed.part2.day0716.MyCollection;
import com.jiepu.daily.corejava.advanceed.part2.day0716.MyCollectionImpl;

/**
 * @Description:
 * @author: xinjie.txt
 * @date: 2020/7/17  8:08
 */
public class MyCollectionTest  {
	public static void main(String[] args) {
// 创建集合对象（多态）
		MyCollection coll = new MyCollectionImpl();
		// 插入四个元素
		coll.add("hello");
		coll.add("world");
		coll.add("hi");
		coll.add("briup");

		// 测试toArray()方法获取集合副本数组
		Object[] array = coll.toArray();
		for (int i = 0; i < array.length; i++) {
			if (array[i].equals("world")) {
				array[i] = "corejava";
			}
			System.out.println(array[i]);
		}

		System.out.println("-----------------------");

		// 使用迭代器遍历集合
		Looper looper =  coll.looper();
		while (looper.hasNext()) {
			System.out.println(looper.next());
		}
	}

	public static void print(MyCollection coll) {
		/*
		 * 使用接口编程的好处：
		 * 当我们使用一个接口类型统一描述所有的集合时，
		 * 可以不关心它具体的实现类类型而完成操作。
		 *
		 * 这里我们不需要知道coll到底是谁，
		 * 就可以调用looper()方法获取它的迭代器。
		 * 因为looper()方法定义在MyCollection接口中。
		 *
		 * 拿到的迭代器我们也不需要关心是哪个类型，
		 * 统一使用接口类型Looper接收，
		 * 这也是MyCollection接口中定义的标准。
		 *
		 * 这样能够极大地增加API的易用性、降低学习成本、提高工作效率
		 * 也增加了程序的可扩展性。
		 *
		 * 假设将来重新编写了该接口的新的实现类， 这里的代码不需要进行任何修改就能直接兼容，因为接口定义了标准，
		 * 而实现类一定是遵循标准的。
		 */
		Looper looper = coll.looper();
		while (looper.hasNext()) {
			System.out.println(looper.next());
		}


	}
}
